package com.bookshop.scheduler;

import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @author g2l
 * @create 2022-09-16 23:42
 */
@Slf4j
@Component
public class QuartzUtil {

    // 定时器的cron表达式
    @Value("${spring.quartz.cron}")
    private String cron;

    // 定时器的cron表达式
    @Value("${spring.quartz.cron1}")
    private String cron1;

    /**
     * 获取JobDetail任务信息，并绑定任务内容的方法，该job是非持久化的
     *
     * @param jobName   任务名称，jobGround和jobName都是用来组成job的唯一标识JobKey的
     * @param jobGround 任务组名，jobGround可以在逻辑上把一些任务放在一起
     * @param jobData   任务数据，包括传递给任务的参数
     * @param job       具体执行的Job实现类
     * @return          返回JobDetail对象，包含了任务的详细信息和执行内容
     */
    public JobDetail getJobDetail(String jobName, String jobGround, JobDataMap jobData, Job job) {
        return JobBuilder.newJob(job.getClass())
                .withIdentity(jobName, jobGround)
                .usingJobData(jobData)
                .build();
    }

    public JobDetail getJobDetail(JobKey jobKey, JobDataMap jobData, Job job) {
        return JobBuilder.newJob(job.getClass())
                .withIdentity(jobKey)
                .usingJobData(jobData)
                .build();
    }

    /**
     * 获取定时器/触发器 Trigger 的方法
     *
     * @param triggerName   触发器名称
     * @param triggerGround 触发器组名
     * @param jobData       触发器数据，包括传递给触发器的参数
     * @return              返回Trigger对象，包含了触发器的详细信息和执行计划
     */
    public Trigger getTrigger(String triggerName, String triggerGround, JobDataMap jobData) {
        return TriggerBuilder.newTrigger()
                .withIdentity(triggerName, triggerGround)
                .usingJobData(jobData)
                .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                .build();
    }


    public Trigger getTrigger1(String triggerName, String triggerGround, JobDataMap jobData) {
        return TriggerBuilder.newTrigger()
                .withIdentity(triggerName, triggerGround)
                .usingJobData(jobData)
                .withSchedule(CronScheduleBuilder.cronSchedule(cron1))
                .build();
    }
}
